class Solution {
public:
    double findMedianSortedArrays(std::vector<int>& nums1, std::vector<int>& nums2) {
        // 确保 nums1 是较短的数组，以优化二分查找的范围
        if (nums1.size() > nums2.size()) {
            return findMedianSortedArrays(nums2, nums1);
        }

        int m = nums1.size();
        int n = nums2.size();

        // 在 nums1 上进行二分查找，寻找最佳分割点
        int low = 0, high = m;
        // halfLen 表示合并后数组左半部分的元素个数
        int halfLen = (m + n + 1) / 2;

        while (low <= high) {
            // i 是 nums1 的分割点
            int i = low + (high - low) / 2;
            // j 是 nums2 的分割点
            int j = halfLen - i;

            // 获取分割线两侧的四个关键值
            // maxLeft1 是 nums1 左侧最大值
            int maxLeft1 = (i == 0) ? std::numeric_limits<int>::min() : nums1[i - 1];
            // minRight1 是 nums1 右侧最小值
            int minRight1 = (i == m) ? std::numeric_limits<int>::max() : nums1[i];
            
            // maxLeft2 是 nums2 左侧最大值
            int maxLeft2 = (j == 0) ? std::numeric_limits<int>::min() : nums2[j - 1];
            // minRight2 是 nums2 右侧最小值
            int minRight2 = (j == n) ? std::numeric_limits<int>::max() : nums2[j];

            if (maxLeft1 <= minRight2 && maxLeft2 <= minRight1) {
                // 找到了完美的分割点
                if ((m + n) % 2 == 0) {
                    // 总数为偶数
                    return (std::max(maxLeft1, maxLeft2) + std::min(minRight1, minRight2)) / 2.0;
                } else {
                    // 总数为奇数
                    return std::max(maxLeft1, maxLeft2);
                }
            } else if (maxLeft1 > minRight2) {
                // nums1 的分割点太靠右了，需要向左移动
                high = i - 1;
            } else { // maxLeft2 > minRight1
                // nums1 的分割点太靠左了，需要向右移动
                low = i + 1;
            }
        }
        
        // 理论上，如果输入有效，不会执行到这里
        return 0.0;
    }
};